package com.zoe.java8.lambdaTest;

/**
 * @Author Zoe
 * @Date: 2021/04/30
 * @Description
 */

/**
 * 口诀：复制小括号（写参数），写死又箭头，落地大括号（写逻辑）
 * 接口只有一个方法，可以使用lambda表达式；
 * 简写规则  参数列表只有一个参数的时候 ()可以省略  x -> { dosth..};
 * 代码块中只有一行代码的时候可以生省略{}   x -> dosth...;
 * 当有返回值的时候且代码块中只有一行代码的可以生省略{}和return  x -> dosth...;
 */
public interface FooTest {
    String str = "lambda 变量";

    public void sayHello();

    default int div(int x, int y) {
        System.out.println(str);
        return x / y;
    }

    static int mv(int x, int y) {
        System.out.println(str);
        return x * y;
    }
}

interface FiledFoo {
    String sayName(String name);
}

class Foo {
    public static void main(String[] args) {
        FooTest fooTest = new FooTest() {
            @Override
            public void sayHello() {
                System.out.println("你说话");
            }
        };
        fooTest.sayHello();

        // 你好lambda
        FooTest fooTest1 = () -> System.out.println("你好lambda");
        fooTest1.sayHello();
        System.out.println(fooTest.div(10, 5));
        System.out.println(FooTest.mv(5, 20));

        // 匿名内部类写法
        FiledFoo filedFoo = new FiledFoo() {
            @Override
            public String sayName(String name) {
                return name.length() + "";
            }
        };
        System.out.println(filedFoo.sayName("小东北"));

        // 带参输入lambda
        FiledFoo filedFoo1 = (x) -> {
            return x.length() + "";
        };

        // 带参输入lambda;简写
        FiledFoo filedFoo3 = x -> x.length() + "";
        System.out.println(filedFoo3.sayName("李子明"));
    }
}
